package com.moyu.gateway.filter;

import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.reactor.filter.SaReactorFilter;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 网关拦截
 *
 * @Author 赵彦博
 * @Date 2024/12/27 13:58
 */
@Configuration
public class SaTokenConfigure {

    @Value("")
    private String secret;

    /**
     * 注册 [Sa-Token全局过滤器]
     */
    @Bean
    public SaReactorFilter getSaReactorFilter() {
        return new SaReactorFilter()
                // 指定 [拦截路由]
                .addInclude("/**")    /* 拦截所有path */
                // 指定 [放行路由]
                .addExclude("/favicon.ico","/user/queryUserByAccount/**")
                // 指定[认证函数]: 每次请求执行
                .setAuth(obj -> {
                    System.out.println("---------- sa全局认证");
                    // 登录校验 -- 拦截所有路由，并排除/loginAndReg/doLogin 用于开放登录
                    SaRouter.match("/**", "/loginAndReg/doLogin", r -> StpUtil.checkLogin());

                    // 权限认证 -- 不同模块, 校验不同权限
                    SaRouter.match("/sysUser/**", r -> StpUtil.checkRole("admin"));
                    SaRouter.match("/user/**", r -> StpUtil.checkRole("user"));
                })
                // 指定[异常处理函数]：每次[认证函数]发生异常时执行此函数
                .setError(e -> {
                    System.out.println("---------- sa全局异常 ");
                    return SaResult.error(e.getMessage());
                })
                ;
    }

//    /**
//     * 重写 Sa-Token 框架内部算法策略
//     */
//    @PostConstruct
//    public void rewriteSaStrategy() {
//        // 重写 Token 生成策略
//        SaStrategy.instance.createToken = (loginId, loginType) -> {
//            return SaFoxUtil.getRandomString(60);    // 随机60位长度字符串
//        };
//    }

    /**
     * Sa-Token 整合 jwt
     * @return
     */
    @Bean
    public StpLogic getStpLogicJwt() {
        // 混合模式
        // return new StpLogicJwtForMixin();
        // 无状态模式
        // return new StpLogicJwtForStateless();
        // (Simple 简单模式)
        return new StpLogicJwtForSimple();
    }
}
